// package com.dhcc.filter;
//
// import lombok.extern.slf4j.Slf4j;
// import org.springframework.cloud.gateway.filter.GatewayFilterChain;
// import org.springframework.cloud.gateway.filter.GlobalFilter;
// import org.springframework.context.annotation.Configuration;
// import org.springframework.core.Ordered;
// import org.springframework.core.io.buffer.DataBuffer;
// import org.springframework.core.io.buffer.DataBufferUtils;
// import org.springframework.http.HttpHeaders;
// import org.springframework.http.server.reactive.ServerHttpRequest;
// import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
// import org.springframework.web.server.ServerWebExchange;
// import reactor.core.publisher.Flux;
// import reactor.core.publisher.Mono;
//
// import java.io.ByteArrayOutputStream;
// import java.io.IOException;
// import java.nio.charset.StandardCharsets;
//
// import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.addOriginalRequestUrl;
//
// /**
//  * 请求报文打印
//  *
//  * @author liuguoting
//  */
// @Slf4j
// @Configuration
// public class RequestLogGlobalFilter implements GlobalFilter, Ordered {
//
//     @Override
//     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//         log.info("进入请求过滤器.....");
//         ServerHttpRequest request = exchange.getRequest();
//         addOriginalRequestUrl(exchange, request.getURI());
//         String method = request.getMethod().toString();
//         //cors
//         HttpHeaders headers = request.getHeaders();
//         String rawPath = request.getURI().getRawPath();
//         log.info("请求数据 --> method: [{}] url: [{}] header: [{}]", method, rawPath, headers);
//         // 如果是 POST 请求
//         if ("POST".equals(method)) {
//             // 获取请求体
//             Flux<DataBuffer> requestBody = exchange.getRequest().getBody();
//
//             // 判断请求体是否为空，避免使用 block() 方法
//             return requestBody
//                     .collectList()  // 将 Flux<DataBuffer> 转换为 List<DataBuffer>
//                     .flatMap(dataBuffers -> {
//                         if (dataBuffers.isEmpty()) {
//                             // 如果请求体为空，直接跳过请求体处理
//                             log.info("请求体为空，跳过请求体处理");
//                             return chain.filter(exchange); // 直接继续执行后续链条
//                         } else {
//                             // 如果请求体不为空，继续处理请求体
//                             byte[] bytes;
//                             try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
//                                 // 将请求体的所有数据流合并到一个 byte 数组中
//                                 for (DataBuffer dataBuffer : dataBuffers) {
//                                     byte[] chunk = new byte[dataBuffer.readableByteCount()];
//                                     dataBuffer.read(chunk);
//                                     outputStream.write(chunk);
//                                 }
//                                 bytes = outputStream.toByteArray();  // 获取合并后的字节数组
//                             } catch (IOException e) {
//                                 log.error("合并请求体字节数据时发生异常", e);
//                                 bytes = new byte[0]; // 如果发生异常，防止未定义的情况
//                             }
//
//                             // 将字节数据转换为字符串
//                             final String bodyString = new String(bytes, StandardCharsets.UTF_8);  // 保证 bodyString 为有效 final
//                             // 日志打印请求体内容
//                             log.info("请求报文 --> body: [{}]", bodyString);
//
//                             // 将请求体内容保存到 exchange 属性中，供后续使用
//                             exchange.getAttributes().put("POST_BODY", bodyString);
//
//                             // 释放 DataBuffer 资源
//                             dataBuffers.forEach(DataBufferUtils::release);
//
//                             // 创建一个缓存的 Flux，用于后续的请求处理
//                             byte[] finalBytes = bytes;
//                             Flux<DataBuffer> cachedFlux = Flux.defer(() -> {
//                                 DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(finalBytes);
//                                 return Mono.just(buffer);
//                             });
//
//                             // 创建一个装饰后的请求，使用缓存的请求体数据
//                             ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator(exchange.getRequest()) {
//                                 @Override
//                                 public Flux<DataBuffer> getBody() {
//                                     return cachedFlux;
//                                 }
//                             };
//
//                             // 将修改后的请求传递到后续过滤器
//                             return chain.filter(exchange.mutate().request(mutatedRequest).build());
//                         }
//                     });
//         } else if ("GET".equals(method)) {
//             log.info("请求参数 --> params :[{}]", request.getQueryParams());
//             return chain.filter(exchange);
//         }
//         return chain.filter(exchange);
//     }
//
//     @Override
//     public int getOrder() {
//         return -1000;
//     }
//
// }
